iT邦幫忙

2025 iThome 鐵人賽

DAY 0
0
自我挑戰組

Leetcode自學系列 第 16

Day16複習+筆記

  • 分享至 

  • xImage
  •  
  1. Reverse Linked List,這題讓我真正理解到鏈結串列的指標操作。剛開始接觸時會對「反轉指標方向」感到抽象,但實際上使用三個指標變數(前一個、當前、下一個)來迴圈操作後,就會慢慢體會到鏈結串列的本質。進一步用遞迴的方式來實作,則讓我更清楚地認識遞迴在資料結構中的應用,也鍛鍊我對「回傳值與指標連接」的理解。
    接著在 21. Merge Two Sorted Lists這題中,我學會了使用虛擬頭節點來簡化邏輯。兩個已排序的鏈結串列需要合併成一個排序好的鏈結串列,看似複雜,但其實邏輯很直覺,只需要兩個指針比較大小,逐步串接。這題讓我更加熟悉操作節點與連接的過程,同時也學會處理各種邊界情況,這在後續處理多條鏈結串列(如 merge k lists)時非常有幫助。
    而 141. Linked List Cycle則是我第一次接觸「快慢指針」這個技巧,這題啟發我思考空間與時間的權衡。為了以 O(1) 的空間檢查鏈結串列是否有環,我們不能用 HashSet 來記錄走過的節點,只能靠指針的追逐邏輯去判斷。一旦理解快慢指針的移動模式,就會對後續判斷環、找到環的起點等題型有更深一層的認識。
  2. Min Stack這題看起來是個簡單的堆疊設計問題,但實際上讓我學會了「輔助堆疊」這個設計思路。若我們想要在 O(1) 的時間內取得當前堆疊中的最小值,那就必須在每次 push 和 pop 的同時,額外維護一個對應的最小值堆疊。這是第一次讓我意識到「空間換時間」的實作技巧,也讓我學會在設計資料結構時,要如何同步維護不同層次的資訊。
    進入搜尋領域,704. Binary Search則是演算法中最經典的入門題目之一。儘管理論上很簡單,實際撰寫時常常會因為邊界條件的處理而出錯,例如 left, right, mid的設定、收斂條件與無限迴圈的風險。我從這題中學到了一個清楚的教訓:演算法不僅是概念清楚,更需要在實作時精確掌握細節,尤其是對邊界的掌握。
    最後的278. First Bad Version則是二分搜尋在「條件查找」上的延伸。這題與單純找某個值不同,它的目標是要找出「第一個滿足某條件」的位置,這對我來說是一個觀念的升級。從這題開始,我理解了所謂的「條件性二分搜尋」技巧,即透過不斷縮小條件成立與不成立的範圍,最終找到邊界點。這個概念也延伸到其他類似題目,例如搜尋旋轉陣列中的最小值、找峰值、找最早符合要求的時間等。
    總體來說,這六題不只讓我熟悉了基本資料結構如鏈結串列、堆疊與陣列,更讓我學會了幾個非常關鍵的解題技巧與思維方式,例如快慢指針、輔助堆疊、虛擬頭節點與條件型二分搜尋。這些技巧雖然在一開始看似分散,但其實都是後續更進階演算法(如滑動視窗、動態規劃、圖論等)不可或缺的基礎。經過這幾題的練習,我不只是學會了怎麼「寫出來」,更重要的是學會了如何思考與拆解問題,這是我在這幾題中最重要的收穫。

上一篇
Day 15第一個錯誤版本
系列文
Leetcode自學16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言